/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package vista;

import java.util.Stack;
import modelo.ErrorSintaxis;
/**
 *
 * @author Jorge Lopez
 */
public class Validator {

    private static final char L_PAREN = '(';
    private static final char R_PAREN = ')';
    private static String expresion;

    public static void validate(String str) throws ErrorSintaxis {
        expresion = str;
        isBalanced(expresion);

        for (int i = 0; i < expresion.length(); i++) {
            switch (expresion.charAt(i)) {
                case ')': {
                    validarParentesisCerrado(i);
                    break;
                }
            }
        }
    }

    private static void validarParentesisCerrado(int posicion) throws ErrorSintaxis {
        if (enRango(posicion - 1)) {
            char anterior = expresion.charAt(posicion - 1);
            if (compararConOperadores(anterior)) {
                throw new ErrorSintaxis("Tienes un operador que se encuentra antes de un parentesis de cierre");
            }
        }
    }

    private static boolean compararConParentesisAbierto(char token) {
        return token == '(';
    }

    private static boolean compararConOperadores(char token) {
        return token == 43 || token == 42 || token == 45 || token == 47;
    }

    private static boolean compararConNumeros(char token) {
        return token <= 57 && token >= 45;
    }

    private static boolean enRango(int posicion) {
        return posicion >= 0 && posicion < expresion.length();
    }

    private static void isBalanced(String s) throws ErrorSintaxis {
        Stack<Character> stack = new Stack<Character>();
        for (int i = 0; i < s.length(); i++) {

            if (s.charAt(i) == L_PAREN) {
                stack.push(L_PAREN);

            } else if (s.charAt(i) == R_PAREN) {
                if (stack.isEmpty()) {
                    throw new ErrorSintaxis("Los parentesis no estan balanceados");
                }
                if (stack.pop() != L_PAREN) {
                    throw new ErrorSintaxis("Los parentesis no estan balanceados");
                }
            }
        }
        if (!stack.isEmpty()) {
            throw new ErrorSintaxis("Los parentesis no estan balanceados");
        }
    }
}